package function.client.adaptor;

import function.client.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Component;

import java.util.Objects;

/**
 * 奖励用户积分 - facade方法适配器
 *
 * @author G_Y, 2022/3/30 9:30
 * @version 1.0.0
 **/
@Slf4j
@Component
public class UserFacadeRewardPointsAdaptor implements FacadeMethodAdaptor<rewardPointsRequestDTO, RpcResult<Boolean>> {

    // 可以针对userFacade进行单独的一些配置，比如 retries = 0
    @Reference(version = "1.0.0", check = false, retries = 0)
    private UserFacade userFacade;

    @Override
    public RpcResult<Boolean> facadeMethodInvoke(rewardPointsRequestDTO rewardPointsRequestDTO) {
        return userFacade.rewardPoints(rewardPointsRequestDTO);
    }

    @Override
    public boolean resultCheck(rewardPointsRequestDTO req, RpcResult<Boolean> result) {

        // 这里的result如果不是RpcResult类型，需要单独判断业务调用是否成功

        if (Objects.isNull(result.getData())) {
            // 这里可以补充具体不符合预期的原因日志，不需要再打请求参数，响应结果，可以根据日志上下文定位
            log.error(LogUtils.errorLog("{} RPC调用，响应的Result中data为空，不符合约定。", this.getLogErrorCode()),
                    this.getFacadeMethodName());
            return false;
        }

        if (!result.getData()) {
            // 这里可以补充具体不符合预期的原因日志
            log.error(LogUtils.errorLog("{} RPC调用，响应的data为false，不符合约定。", this.getLogErrorCode()),
                    this.getFacadeMethodName());
            return false;
        }

        // 符合期望
        return true;

    }

    @Override
    public String getFacadeMethodName() {
        return "function.client.UserFacade#rewardPoints";
    }

    @Override
    public String getLogErrorCode() {
        return ClientLogErrorCode.RPC_USER_ERROR_CODE;
    }
}
